Maria José Castro Lemus
Paula Camila González Ortega
Adjunto a este NoteBook encontrarán el archivo Autos-csv que contiene datos sobre automóviles de segunda mano. El objetivo principal de este ejercicio es desarrollar un modelo que permita, en base a las características (features) que tiene el archivo, predecir el costo de un vehículo usado.
A diferencia de la mayoría de ejercicios, este archivo no ha sido depurado, es decir los datos son crudos (raw). Esto quiere decir que antes de trabajar sobre un modelo predictivo, deben realizar el proceso total, desde limpieza de datos, exploración inicial, etc.
A continuación encontrarán que hay encabezados que bien podrían ayudarlos a desarrollar el código requerido. Estos están a manera de sugerencia únicamente y Ustedes decidirán si los usan, modifican, eliminan, agregan a los mismos
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from quickda.explore_data import *
from quickda.clean_data import *
from quickda.explore_numeric import *
from quickda.explore_categoric import *
from quickda.explore_numeric_categoric import *
from quickda.explore_time_series import *
%matplotlib inline
raw_df = pd.read_csv('Autos.csv')
raw_df.head()
raw_df.info()
raw_df.describe()
explore(raw_df, method="summarize")
sns.pairplot(raw_df)
raw_df.columns
X = raw_df[['Brand','Body', 'Mileage', 'EngineV', 'Engine Type','Year']]
y = raw_df['Price']
print(X,y)
eda_numcat(raw_df, "Price",
method = "pps")
sns.heatmap(raw_df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
raw_df['EngineV'].isna().sum()
raw_df['Price'].isna().sum()
# se les pone el precio promedio
def imputar_precios(cols):
precio = cols[0]
if pd.isnull(precio):
return 19418.74
else:
return precio
# se les pone el enginev promedio
def imputar_enginev(cols):
enginev = cols[0]
if pd.isnull(enginev):
return 2.79
else:
return enginev
raw_df['Price'] = raw_df[['Price']].apply(imputar_precios,axis=1) #axis 1 es columnas
raw_df['EngineV'] = raw_df[['EngineV']].apply(imputar_enginev,axis=1) #axis 1 es columnas
sns.heatmap(raw_df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
raw_df['Price'].hist(color='green',bins=40,figsize=(8,4))
raw_df['Mileage'].hist(color='green',bins=40,figsize=(8,4))
#Descartada por su distribucion
raw_df['Year'].hist(color='green',bins=40,figsize=(8,4))
#Descartada por su distribucion
raw_df['EngineV'].hist(color='green',bins=40,figsize=(8,4))
plt.figure(figsize=(15, 7))
sns.boxplot(x='Brand',y='Price',data=raw_df,palette='winter')
plt.figure(figsize=(15, 7))
sns.boxplot(x='Body',y='Price',data=raw_df,palette='winter')
plt.figure(figsize=(15, 7))
sns.boxplot(x='Engine Type',y='Price',data=raw_df,palette='winter')
raw_df = clean(raw_df, method="outliers",
columns=[])
import statsmodels.api as sm
y = raw_df['Price']
x1 = raw_df[['Mileage', 'EngineV', 'Year']]
x = sm.add_constant(x1)
results = sm.OLS(y,x).fit()
results.summary()
#matriz de correlación
sns.heatmap(raw_df.corr(), annot = True)
from statsmodels.stats.outliers_influence import variance_inflation_factor
def calc_vif(X):
# Calculating VIF
vif = pd.DataFrame()
vif["variables"] = X.columns
vif["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
return(vif)
X = raw_df[['Mileage', 'EngineV', 'Year']]
calc_vif(X)
marca = pd.get_dummies(raw_df['Brand'], drop_first=True)
marca
tipo = pd.get_dummies(raw_df['Body'], drop_first=True)
tipo
combustible = pd.get_dummies(raw_df['Engine Type'], drop_first=True)
combustible
train = pd.concat([raw_df,marca,tipo,combustible],axis=1) #le agregamos las columnas dummies que creamos antes
train.head()
train.columns
#X = raw_df[['Brand','Body', 'Mileage', 'EngineV', 'Engine Type','Year']]
X = train[['Mileage', 'EngineV','Year', 'BMW', 'Mercedes-Benz', 'Mitsubishi',
'Renault', 'Toyota', 'Volkswagen', 'hatch', 'other', 'sedan', 'vagon',
'van', 'Gas', 'Other', 'Petrol']]
#X = train[['Mileage', 'EngineV','Year']]
y = train['Price']
print(X,y)
from sklearn.preprocessing import StandardScaler
escalador = StandardScaler()
escalador.fit(X)
cols_std = escalador.transform(X)
print(cols_std)
type(cols_std)
df_std = pd.DataFrame(cols_std, columns=X.columns)
df_std.head()
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,
train['Price'], test_size=0.30,
random_state=101)
# X son todos menos price y Y es solo la columna price
from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X_train,y_train)
predicciones = lm.predict(X_test)
from sklearn.metrics import r2_score
r2 = r2_score(y_test,predicciones)
print(r2)
Nótese que este no es el R^2 ajustado. En otras palabras hay que encontrar el R^2 ajustado para tener una medida más adecuada
n = número de observaciones
p = número de predictores
p = len(predicciones)
n = X.shape[1]
r2_ajustado = 1 - (1-r2)*((n-1)/(n-p-1))
print(r2_ajustado)
coeficientes = pd.DataFrame(lm.coef_, X.columns, columns=['Coeficiente'])
coeficientes
# imprimir la intercepción (constante)
print(lm.intercept_)
plt.xlim(0, 45000)
plt.ylim(0, 45000)
plt.scatter(y_test,predicciones)
sns.displot((y_test - predicciones),bins=50);
from sklearn import metrics
print('MAE:', metrics.mean_absolute_error(y_test, predicciones))
print('MSE:', metrics.mean_squared_error(y_test, predicciones))
print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, predicciones)))
La marca, el tipo, el millaje, los cilindros, el tipo de combustible y año son factores que afectan linealmente el precio de un carro
El año y millaje son variables con alta multicolinealidad por lo que el valor de una tiene impacto en la otra
Al evaluar las métricas de errores para la regresión lineal se determinó que estas se encuentran dentro del estándar y por lo tanto se realizó correctamente el training de la data y posteriormente la predicción